package simulator;

import java.util.Random;


public class Heating 
{
    
    //Variabler
    private double area;            //hus størrelse (m^2)
    private int type;               //oppvarming type
    private double consumption;     //watt per kvadrat meter
    private double heating;         //stroem forbruk i år
    private double heatingHour;     //strøm forbruk per time
    
    private int time;               //tid
    
    private double u_value_Roof;    //varmegjennomgangskoeffisient til tak
    private double u_value_Floor;   //varmegjennomgangskoeffisient til gulv
    private double u_value_Wall;    //varmegjennomgangskoeffisient til yttervegger
    private double u_value_Window;  //varmegjennomgangskoeffisient til vinduer
    
    private double areaRoof;    //tak areal i kvadratt meter
    private double areaFloor;   //gulv areal i kvadratt meter
    private double areaWall;    //yttervegger areal i kvadratt meter 
    private double areaWindow;  //vinduer areal i kvadratt meter
    
    private double wallsHeight; //høyde på veggene
    
    private int directive;              //hus forskrift
    private double temperatureIn;       //temp. i huset
    private double temperatureOut;      //temp. ute
    
    private double heatlosesRoof;   //tak varmetap (Watt)
    private double heatlosesFloor;  //gulv varmetap (Watt)
    private double heatlosesWall;   //vegg varmetap (Watt)
    private double heatlosesWindow; //vinduer varmtape (Watt)
    private double heatlosesTotal;  //total varmetap (Watt)
   
    //End of variabler
    
    /**
     * 
     * @param _area - hus areal
     * @param _type - Oppvarmings type Brukes ikke enda
     * @param _directive - Forskrift: 0 - Byggeforskrift 1949, 1 - Byggeforskrift 1969
     * 2 - Byggeforskrift 1987, 3 - TEK 97, 4 - TEK 07, 5 - TEK 10, 6 - NS 3700 Passiv- og lavenergihus
     * @param _temperatureIn - Temperatur i huset
     * @param _temperatureOut - Temperatur ute
     * @param _wallsHeight - høyde på veggene
     * @param _areaWindow - vinduer areal
     * @param _time - tid
     */
    public Heating(double _area, int _type, int _directive, double _temperatureIn, double _temperatureOut, double _wallsHeight, double _areaWindow, int _time)
    {
        area = _area;
        type = _type;
        directive = _directive;
        temperatureIn = _temperatureIn;
        temperatureOut = _temperatureOut;
        wallsHeight = _wallsHeight;
        areaWindow = _areaWindow;
        time = _time;
    }   

    /**
     * @return returnere verdien av koeffisienten (varmegjennomgangskoeffisient) avhengig av forskrivning.
     */
    private void U_Value()
    {
        //Byggeforskrift 1949
        if (directive == 0)
        {
            u_value_Roof = 0.6;
            u_value_Floor = 0.8; 
            u_value_Wall = 1.1;
            u_value_Window = 3.48;
        }
        //Byggeforskrift 1969
        else if (directive == 1)
        {
            u_value_Roof = 0.23;
            u_value_Floor = 0.30; 
            u_value_Wall = 0.45;
            //u_value_Window = 0; //Inkludert i ytterveggberegningen
        }
        //Byggeforskrift 1987
        else if (directive == 2)
        {
            u_value_Roof = 0.20;
            u_value_Floor = 0.30; 
            u_value_Wall = 0.30;
            u_value_Window = 2.4;
        }
        //TEK 97
        else if (directive == 3)
        {
            u_value_Roof = 0.15;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.22;
            u_value_Window = 1.6;
        }
        //TEK 07
        else if (directive == 4)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.18;
            u_value_Window = 1.2;
        }
        //TEK 10
        else if (directive == 5)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.18;
            u_value_Window = 1.2;
        }
        //NS 3700 Passiv- og lavenergihus
        else if (directive == 6)
        {
            u_value_Roof = 0.13;
            u_value_Floor = 0.15; 
            u_value_Wall = 0.15;
            u_value_Window = 0.8;
        }    
    }//end of U_Value
    
    /**
     * Metode fom beregner arial av tak, gulv, yttervegger og vinduer
     * For enkelhets skyld antar vi at huset har en kvadratisk form
     */
    private void HouseDimension()
    {
        areaRoof = area;
        areaFloor = area;
        areaWindow = areaWindow;    //Skal brukes senere
        areaWall= 4 * Math.sqrt(area) * wallsHeight - areaWindow;
    }//end of HouseDimension
    
    /**
     * Beregning av varmetap område
     * heatlosesTotal i Watt
     */
    private void heatLossCalculation()
    {
        if(temperatureOut < 0)
        {
        heatlosesRoof = u_value_Roof * (temperatureIn + Math.abs(temperatureOut)) * areaRoof;
        heatlosesFloor = u_value_Floor * (temperatureIn + Math.abs(temperatureOut)) * areaFloor;
        heatlosesWindow = u_value_Window * (temperatureIn + Math.abs(temperatureOut)) * areaWindow;
        heatlosesWall = u_value_Wall * (temperatureIn + Math.abs(temperatureOut)) * areaWall;
        heatlosesTotal = heatlosesRoof + heatlosesFloor + heatlosesWindow + heatlosesWall;
        }
        else
        {
        heatlosesRoof = u_value_Roof * (temperatureIn - temperatureOut) * areaRoof;
        heatlosesFloor = u_value_Floor * (temperatureIn - temperatureOut) * areaFloor;
        heatlosesWindow = u_value_Window * (temperatureIn - temperatureOut) * areaWindow;
        heatlosesWall = u_value_Wall * (temperatureIn - temperatureOut) * areaWall;
        heatlosesTotal = heatlosesRoof + heatlosesFloor + heatlosesWindow + heatlosesWall;
        }  
    }//end of heatLossCalculation
    
    /**
     * Metode caller andre nødvendige metoder til å beregne strøm forbruk
     * @return heating - gjennomsnitt strøm forbruk til oppvarming
     */
    public double Calculation()
    {
        U_Value();
        HouseDimension();
        heatLossCalculation();
        heating = heatlosesTotal * 24;    //24 - timer, 365 - dager 
        return heating;
    }//end of Calculation
    
    /**
     * Metode caller alle nødvendige metoder tilø å beregne strøm forbruk per time
     * @return heatingHour
     */
    public double CalculationTime()
    {
        U_Value();
        HouseDimension();
        heatLossCalculation();
        heatingHour = heatlosesTotal;
        return heatingHour;
    }//end of CalculationTime

}